package com.cskaoyan.keyfinal;

/*
        final关键字：final是最终的意思，可以修饰类，变量，成员方法
        1. final 修饰类, 该类就不能被继承
        2. final 修饰方法， 该方法就不能在子类中被覆盖
        3. final 修饰变量
           a. final修饰局部变量, 该局部变量，只能被赋值一次且仅一次
           b  final修饰成员变量，我们必须保证，在对象创建完毕之前，我们自己必须给该
              成员变量赋值一次，且仅一次


           被final修饰的变量，其实就变成了一个自定义常量
           a. 因为其值在程序运行期间不能被改变
           b. 自定义体现在，常量的名字是我们自定义的

           注意事项:
             如果我们定义多个构造方法，而且我们是通过构造方法给final修饰的成员变量赋值，
             一定要保证，每个构造方法，都要给final修饰的成员变量赋初值
 */
public class Demo1 {
}

final class A {}
// 被final修饰的类，不能被继承
//class B extends A{}

class Father {
    public final void method() {
        System.out.println("method");
    }
}
class TestFinal extends Father {
//    @Override
//    public void method() {
//        System.out.println("method");
//    }


    final int finalValue1;

    final double finalValue2;

    //  通过成员变量的初始化语句，在对象创建完毕之前，给final修饰的成员变量赋初值
    final boolean finalValue3 = true;

    {
        // 利用构造代码块，在对象创建完毕之前，给final修饰的成员变量赋初值
        finalValue2 = 200;

        //finalValue2 = 89;
    }

    public TestFinal() {
        // 利用构造方法，在对象创建完毕之前，final修饰的成员变量赋初值
        finalValue1 = 100;
    }

    public TestFinal(int finalValue1) {
        this.finalValue1 = finalValue1;
    }


    /*
        测试被final修饰的局部变量
     */
    public void testLocalVariable() {
       final int a = 100;
        System.out.println();

        //a = 900;
         // final 修饰的局部变量只能被赋值一次，且仅一次
        //a = 10;

        // 自定义常量


    }

}
